(function(win) {
    // Private array of chars to use
    var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');

// 对Date的扩展，将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子：
// var time1 = new Date().Format("yyyy-MM-dd");
// var time2 = new Date().Format("yyyy-MM-dd hh:mm:ss");
    Date.prototype.Format = function (fmt) { // author: meizz
        var o = {
            "M+": this.getMonth() + 1, // 月份
            "d+": this.getDate(), // 日
            "h+": this.getHours(), // 小时
            "m+": this.getMinutes(), // 分
            "s+": this.getSeconds(), // 秒
            "q+": Math.floor((this.getMonth() + 3) / 3), // 季度
            "S": this.getMilliseconds() // 毫秒
        };
        if (/(y+)/.test(fmt))
            fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        for (var k in o)
            if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
        return fmt;
    };

    /*
          * 年(Y) 可用1-4个占位符
          * 月(m)、日(d)、小时(H)、分(M)、秒(S) 可用1-2个占位符
          * 星期(W) 可用1-3个占位符
          * 季度(q为阿拉伯数字，Q为中文数字)可用1或4个占位符 09:22:51
          *
        alert(new Date().dateFormat('YYYY-mm-dd')); //2021-06-18
        alert(new Date().dateFormat('YYYY年mm月dd日')); //2021年06月18日
        alert(new Date().dateFormat('HH:MM:SS')); //11:20:56
        alert(new Date().dateFormat('HH点MM分SS秒')); //11点21分01秒
        alert(new Date().dateFormat('YYYY-mm-dd HH:MM:SS')); //2021-06-18 09:22:51
        alert(new Date().dateFormat('YYYY年mm月dd日 HH点MM分SS秒'));//2021年06月18日 11点21分18秒
        alert(new Date().dateFormat('YYYY-mm-dd HH:MM:SS WW'));// 2021-06-18 11:21:25 周五
        alert(new Date().dateFormat('YYYY年mm月dd日 HH点MM分SS秒 WW'));//2021年06月18日 11点21分31秒 周五
        alert(new Date().dateFormat('YYYY-mm-dd HH:MM:SS WWW'));//2021-06-18 11:21:37 星期五
        alert(new Date().dateFormat('YYYY年mm月dd日 HH点MM分SS秒 WWW'));//2021年06月18日 11点21分54秒 星期五
        *
        alert(new Date().dateFormat('YYYY-mm-dd HH:MM:SS QQQQ'));//2021-06-18 09:23:22 第二季度
        alert(new Date().dateFormat('YYYY-mm-dd HH:MM:SS WWW QQQQ'));//2021-06-18 09:23:41 星期五 第二季度
      */
    Date.prototype.dateFormat = function (format) {
        let we = this.getDay();                                 // 星期
        let qut = Math.floor((this.getMonth()+3)/3).toString(); // 季度
        const opt = {
            "Y+":this.getFullYear().toString(),                 // 年
            "m+":(this.getMonth()+1).toString(),                // 月(月份从0开始，要+1)
            "d+":this.getDate().toString(),                     // 日
            "H+":this.getHours().toString(),                    // 时
            "M+":this.getMinutes().toString(),                  // 分
            "S+":this.getSeconds().toString(),                  // 秒
            "q+":qut, // 季度
        };
        const week = {      // 中文数字 (星期)
            "0":"日",
            "1":"一",
            "2":"二",
            "3":"三",
            "4":"四",
            "5":"五",
            "6":"六"
        };
        const quarter = {   // 中文数字（季度）
            "1" : "一",
            "2" : "二",
            "3" : "三",
            "4" : "四",
        };
        if(/(W+)/.test(format)){
            format = format.replace(RegExp.$1,(RegExp.$1.length >1 ? (RegExp.$1.length >2 ? '星期'+week[we] : '周'+week[we]) : week[we]))
        };
        if (/(Q+)/.test(format)) {
            // 输入一个Q，只输出一个中文数字，输入4个Q，则拼接上字符串
            format = format.replace(RegExp.$1,(RegExp.$1.length == 4 ? '第'+quarter[qut]+'季度' : quarter[qut]));
        };
        for(let k in opt){
            let r = new RegExp("("+k+")").exec(format);
            if(r){
                // 若输入的长度不为1，则前面补零
                format = format.replace(r[1],(RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length,'0')))
            }
        };
        return format;
    };












    Math.uuid = function (len, radix) {
        var chars = CHARS, uuid = [], i;
        radix = radix || chars.length;

        if (len) {
            // Compact form
            for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
        } else {
            // rfc4122, version 4 form
            var r;

            // rfc4122 requires these characters
            //uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
            uuid[14] = '4';

            // Fill in random data.  At i==19 set the high bits of clock sequence as
            // per rfc4122, sec. 4.1.5
            for (i = 0; i < 36; i++) {
                if (!uuid[i]) {
                    r = 0 | Math.random()*16;
                    uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
                }
            }
        }

        return uuid.join('');
    };

    // A more performant, but slightly bulkier, RFC4122v4 solution.  We boost performance
    // by minimizing calls to random()
    Math.uuidFast = function() {
        var chars = CHARS, uuid = new Array(36), rnd=0, r;
        for (var i = 0; i < 36; i++) {
            if (i==8 || i==13 ||  i==18 || i==23) {
                uuid[i] = '-';
            } else if (i==14) {
                uuid[i] = '4';
            } else {
                if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;
                r = rnd & 0xf;
                rnd = rnd >> 4;
                uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
            }
        }
        return uuid.join('');
    };

    // A more compact, but less performant, RFC4122v4 solution:
    Math.uuidCompact = function() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
            var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
            return v.toString(16);
        });
    };
    // 对Date的扩展，将 Date 转化为指定格式的String
    // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
    // 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
    // 例子：
    // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
    // (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
    //   var time1 = new Date().Format("yyyy-MM-dd");
    //  var time2 = new Date().Format("yyyy-MM-dd hh:mm:ss");
    Date.prototype.Format = function (fmt) { // author: meizz
        var o = {
            "M+": this.getMonth() + 1, // 月份
            "d+": this.getDate(), // 日
            "h+": this.getHours(), // 小时
            "m+": this.getMinutes(), // 分
            "s+": this.getSeconds(), // 秒
            "q+": Math.floor((this.getMonth() + 3) / 3), // 季度
            "S": this.getMilliseconds() // 毫秒
        };
        if (/(y+)/.test(fmt))
            fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        for (var k in o)
            if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
        return fmt;
    }

    var $_GET=(function(){
        var url = window.document.location.href.toString();
        var u = url.split("?");
        if(typeof(u[1]) == "string"){
            u = u[1].split("&");
            var get = {};
            for(var i in u){
                var j = u[i].split("=");
                get[j[0]] = j[1];
            }
            return get;
        } else {
            return {};
        }
    })();
    var UrlParam=(function(){
        var url = window.document.location.href.toString();
        var u = url.split("?");
        if(typeof(u[1]) == "string"){
            u = u[1].split("&");
            var get = {};
            for(var i in u){
                var j = u[i].split("=");
                get[j[0]] = j[1];
            }
            return get;
        } else {
            return {};
        }
    })();


     var $_IsURL = function (str_url){
        var strRegex = "^((https|http|ftp|rtsp|mms)?://)"
            + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@
            + "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184
            + "|" // 允许IP和DOMAIN（域名）
            + "([0-9a-z_!~*'()-]+\.)*" // 域名- www.
            + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二级域名
            + "[a-z]{2,6})" // first level domain- .com or .museum
            + "(:[0-9]{1,4})?" // 端口- :80
            + "((/?)|" // a slash isn't required if there is no file name
            + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
        var re=new RegExp(strRegex);
        //re.test()
        if (re.test(str_url)){
            console.log("ok");
            return (true);
        }else{
            console.log("k");
            return (false);
        }
    }
    /**
     * 获取时分秒时，如果是一位数，要在前面补0
     * @param i
     * @returns {*}
     */
    var  $_check=function (i){
        //方法一，用三元运算符
        var num;
        i<10?num="0"+i:num=i;
        return num;

        //方法二，if语句判断
        //if(i<10){
        //    i="0"+i;
        //}
        //return i;
    }
    /**
     *取两位小数
     * @param i
     * @returns {*}
     */
    var  $_check=function (i){
        //方法一，用三元运算符
        var num;
        i<10?num="0"+i:num=i;
        return num;

        //方法二，if语句判断
        //if(i<10){
        //    i="0"+i;
        //}
        //return i;
    }

  var  $_toDecimal =  function (x) {
        var f = parseFloat(x);
        if (isNaN(f)) {
            return;
        }
        f = Math.round(x*100)/100;
        return f;
    }


//以下是加减乘除精确计算
//加
    var $_floatAdd=function(arg1,arg2){
        var r1,r2,m;
        try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
        try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
        m=Math.pow(10,Math.max(r1,r2));
        return (arg1*m+arg2*m)/m;
    }

//减
    var $_floatSub=function(arg1,arg2){
        var r1,r2,m,n;
        try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
        try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
        m=Math.pow(10,Math.max(r1,r2));
        //动态控制精度长度
        n=(r1>=r2)?r1:r2;
        return ((arg1*m-arg2*m)/m).toFixed(n);
    }

//乘
    var $_floatMul=function(arg1,arg2)   {
        var m=0,s1=arg1.toString(),s2=arg2.toString();
        try{m+=s1.split(".")[1].length}catch(e){}
        try{m+=s2.split(".")[1].length}catch(e){}
        return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
    }


//除
    var $_floatDiv=function(arg1,arg2){
        var t1=0,t2=0,r1,r2;
        try{t1=arg1.toString().split(".")[1].length}catch(e){}
        try{t2=arg2.toString().split(".")[1].length}catch(e){}

        r1=Number(arg1.toString().replace(".",""));

        r2=Number(arg2.toString().replace(".",""));
        return (r1/r2)*Math.pow(10,t2-t1);
    }
    /**
     * 四舍入五 保留N为小数，不够补0
     //number：为你要转换的数字
     //format：要保留几位小数；譬如要保留2位，则值为2
     //zerFill:是否补零。不需要补零可以不填写此参数 需要补0 传 ‘Y’
     例子 var nunber=$_changeTwoDecimal_f(123.456,2,'Y')；
     */
    var  $_changeTwoDecimal_f=function(number,format,zeroFill)
    {
        //判断非空
        if (!$_isEmpty(number))
        {
            //正则匹配:正整数，负整数，正浮点数，负浮点数
            if (!/^\d+(\.\d+)?$|^-\d+(\.\d+)?$/.test(number))
                return number;
            var n=1;
            for(var i=0;i<format;i++){
                n=n*10;
            }

            //四舍五入
            number=Math.round(number*n)/n;
            var str=number.toString();
            //是否补零
            var nis=false;
            if(zeroFill){
                var index;
                if(str.indexOf(".")==-1){
                    index=format;

                }else{
                    index=format-((str.length-1)-str.indexOf("."));
                    nis=true;
                }
                if(index>0&&nis==false){
                    str+='.';
                }
                for(var i=0;i<index;i++){

                    str+='0';
                }
            }
            return str;
        }
        return number;
    }
//非空验证
    var $_isEmpty=function(ObjVal) {
        if ((ObjVal == null || typeof (ObjVal) == "undefined") || (typeof (ObjVal) == "string" && ObjVal == "" && ObjVal != "undefined")) {
            return true;
        } else {
            return false;
        }
    }
    win.$_IsURL=$_IsURL;
    win.$_GET=$_GET;
    win.UrlParam=UrlParam;
    win.$_check=$_check;
    win.$_toDecimal=$_toDecimal;

    win.$_floatAdd=$_floatAdd;
    win.$_floatSub=$_floatSub;
    win.$_floatMul=$_floatMul;
    win.$_floatDiv=$_floatDiv;
    win.$_changeTwoDecimal_f=$_changeTwoDecimal_f;

})(window);
